package cn.fzkj.project.tool.mail;

import cn.fzkj.common.exception.CustomException;
import cn.fzkj.common.utils.StringUtils;
import cn.fzkj.common.utils.file.FileUtils;
import cn.fzkj.framework.mail.MailEntity;
import cn.fzkj.framework.web.domain.ResultVO;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.internet.MimeMessage;
import java.io.File;

/** 邮件处理 */
@Component
public class MailUtils {

    private static final Logger log = LoggerFactory.getLogger(MailUtils.class);

    @Autowired
    private JavaMailSender javaMailSender;

    /** 邮件发送【简单邮件】 */
    public ResultVO sendSimpleMail(String content){
        try{
            MailEntity entity = new Gson().fromJson(content, MailEntity.class);
            checkMailEntity(entity);
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(entity.getFrom()); // 发件人
            message.setSubject(entity.getSubject()); // 主题
            message.setText(entity.getText()); // 正文
            message.setTo(entity.getTo()); // 收件人
            if (StringUtils.isNotNull(entity.getSentDate())){ // 日期
                message.setSentDate(entity.getSentDate());
            }
            if (StringUtils.isNotEmpty(entity.getCc())){  // 抄送人
                message.setCc(entity.getCc());
            }
            javaMailSender.send(message);
        }catch (Exception e) {
            log.error("发送简单邮件发生错误：-> {}", e.getMessage());
        }
        return ResultVO.success();
    }

    /** 邮件发送【带附件邮件】 */
    public ResultVO sendMimeMail(String content){
        log.error("发送复杂邮件。。。");
        try {
            MailEntity entity = new Gson().fromJson(content, MailEntity.class);
            checkMailEntity(entity);
            // true表示构建一个可以带附件的邮件对象
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setSubject(entity.getSubject());
            helper.setFrom(entity.getFrom());
            helper.setTo(entity.getTo());
            helper.setText(entity.getText());
            if (StringUtils.isNotNull(entity.getSentDate())){ // 日期
                helper.setSentDate(entity.getSentDate());
            }
            if (StringUtils.isNotEmpty(entity.getCc())){  // 抄送人
                helper.setCc(entity.getCc());
            }
            // 第一个参数是自定义的名称，后缀需要加上，第二个参数是文件的位置
            File file = new File(entity.getFilePath());
            log.error("邮件地址：-> {}", entity.getFilePath());
            log.error("邮件名称：-》{}", entity.getEnclosureName());
            helper.addAttachment(entity.getEnclosureName(), file);
            log.error("开始发送带附件的邮件。。。。");
            javaMailSender.send(mimeMessage);
            // 删除产生的文件
            FileUtils.deleteFile(entity.getFilePath());
        } catch (Exception e) {
            log.error("发送复杂邮件发生错误：-> {}", e.getMessage());
        }
        return ResultVO.success();
    }

    /**
     * 验证邮箱信息
     * @param entity 邮箱信息类
     */
    private void checkMailEntity(MailEntity entity){
        /** 验证必填项 */
        if (StringUtils.isEmpty(entity.getFrom())) throw new CustomException("发件人不能为空");
        if (StringUtils.isEmpty(entity.getSubject())) throw new CustomException("邮件主题不能为空");
        if (StringUtils.isEmpty(entity.getText())) throw new CustomException("邮件正文不能为空");
        if (entity.getTo().length == 0) throw new CustomException("收件人不能为空");
    }

}
